package com.health.mapp.utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import com.health.mapp.utils.KeywordFilter;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class KeywordFilter {
	/** 直接禁止�?*/
	private HashMap keysMap = new HashMap();
	private int matchType = 2; // 1:�?��长度匹配 2：最大长度匹�?

	public void addKeywords(Set<String> keywords) {
		for (String key : keywords) {
			key = key.trim();
			HashMap nowhash = null;
			nowhash = keysMap;
			for (int j = 0; j < key.length(); j++) {
				char word = key.charAt(j);
				Object wordMap = nowhash.get(word);
				if (wordMap != null) {
					nowhash = (HashMap) wordMap;
				} else {
					HashMap<String, String> newWordHash = new HashMap<String, String>();
					newWordHash.put("isEnd", "0");
					nowhash.put(word, newWordHash);
					nowhash = newWordHash;
				}
				if (j == key.length() - 1) {
					nowhash.put("isEnd", "1");
				}
			}
		}
	}

	/**
	 * 重置关键�?
	 */
	public void clearKeywords() {
		keysMap.clear();
	}

	/**
	 * �?���?��字符串从begin位置起开始是否有keyword符合�?如果有符合的keyword值，返回值为匹配keyword的长度，否则返回�?
	 * flag 1:�?��长度匹配 2：最大长度匹�?
	 */
	private int checkKeyWords(String txt, int begin, int flag) {
		HashMap nowhash = null;
		nowhash = keysMap;
		int maxMatchRes = 0;
		int res = 0;
		int l = txt.length();
		char word = 0;
		for (int i = begin; i < l; i++) {
			word = txt.charAt(i);
			Object wordMap = nowhash.get(word);
			if (wordMap != null) {
				res++;
				nowhash = (HashMap) wordMap;
				if (((String) nowhash.get("isEnd")).equals("1")) {
					if (flag == 1) {
						wordMap = null;
						nowhash = null;
						txt = null;
						return res;
					} else {
						maxMatchRes = res;
					}
				}
			} else {
				txt = null;
				nowhash = null;
				return maxMatchRes;
			}
		}
		txt = null;
		nowhash = null;
		return maxMatchRes;
	}

	/**
	 * 返回txt中关键字的列�?
	 */
	public List<String> getTxtKeyWords(String txt) {
		List<String> list = new ArrayList<String>();
		int l = txt.length();
		for (int i = 0; i < l;) {
			int len = checkKeyWords(txt, i, matchType);
			if (len > 0) {
				System.out.println(txt.substring(0, i));
				String tt = "<font color='#ff0000'>" + txt.substring(i, i + len) + "</font>";
				list.add(tt);
				i += len;
			} else {
				i++;
			}
		}
		txt = null;
		return list;
	}

	public String ReplaceTxtKeyByWords(String txt, String words) {
		StringBuffer sb = new StringBuffer();
		int l = txt.length();
		int pos = 0;
		for (int i = 0; i < l;) {
			int len = checkKeyWords(txt, i, matchType);
			if (len > 0) {
				sb.append(txt.substring(pos, i));
				sb.append(words);
				i += len;
				pos = i;
			} else {
				i++;
			}
		}
		sb.append(txt.substring(pos));
		txt = null;
		return sb.toString();
	}

	/**
	 * 仅判断txt中是否有关键�?
	 */
	public boolean isContentKeyWords(String txt) {
		for (int i = 0; i < txt.length(); i++) {
			int len = checkKeyWords(txt, i, 1);
			if (len > 0) {
				return true;
			}
		}
		txt = null;
		return false;
	}


	public int getMatchType() {
		return matchType;
	}

	public void setMatchType(int matchType) {
		this.matchType = matchType;
	}

	public static void main(String[] args) throws IOException {
		Date date = new Date();
		KeywordFilter filter = new KeywordFilter();
		List<String> keywords = new ArrayList<String>() {
			{
				add("cccccccccc");
			}
		};
		// filter.initfiltercode();
		String txt = "孩子…�?”长孙湘雨闻�?��俊不禁，用手中的折扇掩着嘴，布卖淫女止不住地笑了起来，直到谢安脸上不渝的表情越来越明显，她这才�?渐收起笑意，轻笑�?��道，“呐，舞姐姐本来就是做事细致的人，似你等懒散，她瞧得过去才�?！�?—更别说你还背着她到城里的青楼吃酒，与里面的女子亲亲我我，奴家真是纳闷，舞姐姐那日�?么就没有当场斩了你呢！�?喜欢就好，�?伊伊甜蜜�?��，替谢安盛了�?��饭�?给他，随即纳闷问道，“安，说起来，奴家方才前前后后找过，你这屋子里，锅碗瓢盆�?��都没有，害得我还再回府一趟，将厨灶所�?��那些东西带了来�?…奴家很纳闷，安，你平日里究竟是如何做饭做菜的呢？�?�?��过滤的内容南京大屠杀�?9学潮�?��屠杀舞，你别总是这样好不好？她向我保证过，礼部尚书�?礼部侍郎都是她祖父的门生，望�?��安恳求的目光，梁丘舞幽幽叹了口气，摇头说道，“你还是不明白，安，我不是�?你犯下这欺君之罪，�?是�?你受那个女人摆布，她在想办法控制你，安！舞，我很感激你当初不计前嫌，也不计较身份与地位的差距，与我这�?��平民成婚，并且，对我的照顾也是极为细致，只不过�?…我算是你丈夫吧？我不是你的孩子，也不想当你要教育的对象，你完全没有必要替我安排�?��的事，我有我自己的主观判断能力�?…�?—�?只要你接受了，日后就有个把柄落在她手上�?…�?其余官员，也多受她长孙家提携恩情，FL大法不会有人去追查这件事的，中南海权力斗争就�?��，就�?��，好吗？";
		boolean boo = filter.isContentKeyWords(txt);
		System.out.println(boo);
		String set = filter.ReplaceTxtKeyByWords(txt, "*****");
		System.out.println("#####33" + set);
		Date date2 = new Date();
		float ss = date2.getTime() - date.getTime();
		System.out.println(ss + "毫秒");
	}
}